package cn.tedu.mybatis;

import org.apache.commons.dbcp2.BasicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
//导入的是Spring框架的Resource,注意不要导错!!!!
import org.springframework.core.io.Resource;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:datasource.properties")
@MapperScan("cn.tedu.mybatis.mapper")//不能过于粗糙,扫描接口,去做代理,mybatis处理, 和ComponentScan不同
/*
注意：因为Mybatis会扫描以上配置的包，并自动生成包中各接口中的代
理对象，所以，千万不要放其它接口文件

@PropertySource是Spring框架的注解，用于读取properties类
型的配置文件，读取到的值将存入到Spring容器的Environment对象中
 */
public class SpringConfig {
    @Bean
    public DataSource dataSource(Environment env){
        BasicDataSource dataSource=new BasicDataSource();
        dataSource.setUrl(env.getProperty("datasource.url"));
        dataSource.setDriverClassName(env.getProperty("datasource.driver"));
        dataSource.setUsername(env.getProperty("datasource.username"));
        dataSource.setPassword(env.getProperty("datasource.password"));
        return dataSource;
    }

    @Bean//SqlSessionFactoryBean这个对象准备好, Mybatis框架的要求 会知道数据库的东西   (依赖注入,自动装配)
    /*
    @Value("${mybatis.mapper-locations}") 得到的为字符串,Spring将其转换为Spring的Resource类型
    #{}是预编译处理，${}是字符串替换。
    Mybatis 在处理#{}时，会将 sql 中的#{}替换为?号，调用 PreparedStatement 的
    set 方法来赋值；
    Mybatis 在处理${}时，就是把${}替换成变量的值。
    使用#{}可以有效的防止 SQL 注入，提高系统安全性。

     */
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource,
                                                       @Value("${mybatis.mapper-locations}") Resource mapperLocations){
        SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(mapperLocations);//Mapper.xml文件的路径
        return sqlSessionFactoryBean;
    }
}
